home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / ctlib100.zip / INSTALL.LZH / DISPLAY.PAS < prev    next >
Pascal/Delphi Source File  |  1996-10-12  |  10KB  |  259 lines

  1. {**************************************************************************}
  2. {*  BitSoft Development, L.L.C.                                           *}
  3. {*  Copyright (C) 1995, 1996 BitSoft Development, L.L.C.                  *}
  4. {*  All rights reserved.                                                  *}
  5. {**************************************************************************}
  6.  
  7. unit Display;
  8.  
  9. {$X+}
  10.  
  11. interface
  12.  
  13. uses Drivers, App, Views, TextView, Objects, MsgBox,
  14.      Readers;
  15.  
  16. type
  17.   PContainerScroller = ^TContainerScroller;
  18.   TContainerScroller = object(TScroller)
  19.       Reader : PContainerReader;
  20.     destructor Done; virtual;
  21.     procedure Draw; virtual;
  22.   end; { TContainerScroller }
  23.  
  24. type
  25.   PBsdTerminal = ^TBsdTerminal;
  26.   TBsdTerminal = object(TTerminal)
  27.     constructor Init(var Bounds:TRect; AHScrollBar,
  28.       AVScrollBar: PScrollBar; ABufSize: Word);
  29.     function Valid(Command: Word): Boolean; virtual;
  30.   end; { TBsdTerminal }
  31.  
  32. type
  33.   PResultsWindow = ^TResultsWindow;
  34.   TResultsWindow = object(TWindow)
  35.       T : Text;
  36.       Terminal : PBsdTerminal;
  37.       Scroller : PContainerScroller;
  38.     constructor Init (ATitle: TTitleStr; AReader : PContainerReader);
  39.     destructor Done; virtual;
  40.     procedure SizeLimits(var Min, Max : TPoint); virtual;
  41.     function Valid(Command : Word) : Boolean; virtual;
  42.   end; { TResultsWindow }
  43.  
  44. implementation
  45.  
  46. uses Utils, Memory;
  47.  
  48. {****************************************************************************}
  49. {**                           PRIVATE DECLARATIONS                         **}
  50. {****************************************************************************}
  51. const
  52.   MaxNumberOfFiles = 255;
  53.  
  54. type
  55.   FileNumbers = Set of 1..MaxNumberOfFiles;
  56.  
  57. var
  58.   FilesOpen  : FileNumbers;
  59.  
  60. {****************************************************************************}
  61. { NewNumberAvailable                                                         }
  62. {****************************************************************************}
  63. function NewNumberAvailable (var NewFileNumber: Integer) : Boolean;
  64. var
  65.   Number : Integer;
  66. begin
  67.   NewNumberAvailable := False;
  68.   for Number := 1 to MaxNumberofFiles do
  69.     if not (Number in FilesOpen) then
  70.     begin
  71.       NewFileNumber := Number;
  72.       FilesOpen := FilesOpen + [NewFileNumber];
  73.       NewNumberAvailable := True;
  74.       Exit;
  75.     end; { if }
  76. end; { NewNumberAvailable }
  77.  
  78.  
  79. {****************************************************************************}
  80. {**                     EXPORTED FUNCTIONS AND PROCEDURES                  **}
  81. {****************************************************************************}
  82. {****************************************************************************}
  83. { TBsdTerminal object                                                        }
  84. {****************************************************************************}
  85. {****************************************************************************}
  86. { TBsdTerminal.Init                                                          }
  87. {****************************************************************************}
  88. constructor TBsdTerminal.Init(var Bounds:TRect; AHScrollBar,
  89.   AVScrollBar: PScrollBar; ABufSize: Word);
  90. begin
  91.   TTextDevice.Init(Bounds, AHScrollBar, AVScrollBar);
  92.   GrowMode := gfGrowHiX + gfGrowHiY;
  93.   BufSize := ABufSize;
  94.   if BufSize > 65520 then BufSize := 65520;
  95.   Buffer := MemAlloc(BufSize); { <-- Instead of GetMem(Buffer, BufSize) }
  96.   QueFront := 0;
  97.   QueBack := 0;
  98.   SetLimit(0,1);
  99.   SetCursor(0,0);
  100.   ShowCursor;
  101. end;
  102.  
  103. {****************************************************************************}
  104. { TBsdTerminal.Valid                                                         }
  105. {****************************************************************************}
  106. function TBsdTerminal.Valid(Command: Word): Boolean;
  107. begin
  108.   Valid := inherited Valid(Command) and
  109.            ((Command <> cmValid) or (Buffer <> nil));
  110. end;
  111.  
  112. {****************************************************************************}
  113. { TContainerScroller object                                                  }
  114. {****************************************************************************}
  115. {****************************************************************************}
  116. { TContainerScroller.Draw                                                    }
  117. {****************************************************************************}
  118. procedure TContainerScroller.Draw;
  119. var
  120.   B : TDrawBuffer;
  121.   i : LongInt;
  122.   Text : string;
  123. begin
  124.   Desktop^.Lock;
  125.   if Reader^.Container <> nil
  126.     then SetLimit(Size.X, Reader^.Container^.Count + 3)
  127.     else SetLimit(Size.X, 3);
  128.   VScrollBar^.SetStep(Size.Y - 3, 1);
  129.   MoveChar(B, ' ', GetColor(1), Size.X);
  130.   WriteLine(0, 0, Size.X, Size.Y, B);
  131.   Text := 'Count: '+Reader^.Count;
  132.   MoveStr(B, Text, GetColor(1));
  133.   WriteLine(1, 0, Length(Text), 1, B);
  134.   Text := Reader^.OtherInfo;
  135.   MoveStr(B, Text, GetColor(1));
  136.   WriteLine(1, 1, Length(Text), 1, B);
  137.   MoveChar(B, '-', GetColor(1), Size.X);
  138.   WriteLine(0, 2, Size.X, 1, B);
  139.   for i := 3 to (Size.Y - 1) do
  140.   begin
  141.     Text := Reader^.GetText(Delta.Y + (i - 3));
  142.     MoveStr(B, Text, GetColor(1));
  143.     WriteLine(1, i, Length(Text), 1, B);
  144.   end; { for }
  145.   Desktop^.UnLock;
  146. end;
  147.  
  148. {****************************************************************************}
  149. { TContainerScroller.Done                                                    }
  150. {****************************************************************************}
  151. destructor TContainerScroller.Done;
  152. begin
  153.   if Reader <> nil
  154.     then Dispose(Reader, Done);
  155.   TScroller.Done;
  156. end;
  157.  
  158. {****************************************************************************}
  159. { TResultsWindow object                                                      }
  160. {****************************************************************************}
  161. {****************************************************************************}
  162. { TResultsWindow.Init                                                        }
  163. {****************************************************************************}
  164. constructor TResultsWindow.Init (ATitle: TTitleStr; AReader :
  165.   PContainerReader);
  166. var
  167.   HScroll, VScroll : PScrollBar;
  168.   Bounds, R, Limits : TRect;
  169.   WinNumber : Integer;
  170. begin
  171.   if not NewNumberAvailable(WinNumber)
  172.     then begin
  173.            MessageBox('Please close other windows and try again.', nil,
  174.              mfError + mfOkButton);
  175.            Fail;
  176.          end; { if }
  177.   if Desktop^.Current <> nil
  178.     then begin
  179.            Bounds.A := Desktop^.Current^.Origin;
  180.            Bounds.B.X := Bounds.A.X + Desktop^.Current^.Size.X;
  181.            Bounds.B.Y := Bounds.A.Y + Desktop^.Current^.Size.Y;
  182.            Inc(Bounds.A.X);
  183.            Inc(Bounds.A.Y);
  184.          end { if }
  185.     else Desktop^.GetExtent(Bounds);
  186.   TWindow.Init(Bounds, ATitle, WinNumber);
  187.   SizeLimits(Limits.A, Limits.B);
  188.   if ((Bounds.B.Y - Bounds.A.Y) < Limits.A.Y) or
  189.      ((Bounds.B.X - Bounds.A.X) < Limits.A.X)
  190.     then begin
  191.            Desktop^.GetExtent(Bounds);
  192.            ChangeBounds(Bounds);
  193.          end; { if }
  194.   Options := Options or ofTileable;
  195.   GetExtent(Bounds);
  196.   Dec(Bounds.B.X, 15);
  197.   R.Assign(Bounds.B.X-1, Bounds.A.Y+1, Bounds.B.X, Bounds.B.Y-1);
  198.   VScroll := New(PScrollBar, Init(R));
  199.   VScroll^.Options := VScroll^.Options or ofPostProcess;
  200.   R.Assign(Bounds.A.X+2, Bounds.B.Y-1, Bounds.B.X-2, Bounds.B.Y);
  201.   HScroll := New(PScrollBar, Init(R));
  202.   HScroll^.Options := HScroll^.Options or ofPostProcess;
  203.   Insert(VScroll);
  204.   Insert(HScroll);
  205.   Bounds.Grow(-1, -1);
  206.   New(Terminal, Init(Bounds, HScroll, VScroll, 32768));
  207.   Terminal^.Options := Terminal^.Options or ofFramed;
  208.   Insert(Terminal);
  209.   AssignDevice(T, Terminal);
  210.   Rewrite(T);
  211.   GetExtent(Bounds);
  212.   Bounds.A.X := Bounds.B.X - 16;
  213.   R.Assign(Bounds.B.X-1, Bounds.A.Y+4, Bounds.B.X, Bounds.B.Y-1);
  214.   VScroll := New(PScrollBar, Init(R));
  215.   VScroll^.Options := VScroll^.Options or ofPostProcess;
  216.   R.Assign(Bounds.A.X+2, Bounds.B.Y-1, Bounds.B.X-2, Bounds.B.Y);
  217.   HScroll := New(PScrollBar, Init(R));
  218.   HScroll^.Options := HScroll^.Options or ofPostProcess;
  219.   HScroll^.GrowMode := gfGrowAll;
  220.   Insert(VScroll);
  221.   Insert(HScroll);
  222.   Bounds.Grow(-1, -1);
  223.   Scroller := New(PContainerScroller, Init(Bounds, HScroll, VScroll));
  224.   Scroller^.GrowMode := gfGrowLoX + gfGrowHiX + gfGrowHiY;
  225.   Scroller^.Reader := AReader;
  226.   Scroller^.Reader^.Owner := Scroller;
  227.   Insert(Scroller);
  228.   SelectNext(True);
  229. end;
  230.  
  231. {****************************************************************************}
  232. { TResultsWindow.Done                                                        }
  233. {****************************************************************************}
  234. destructor TResultsWindow.Done;
  235. begin
  236.   DisplayMessage('Freeing system resources... please wait.');
  237.   FilesOpen := FilesOpen - [Number];
  238.   TWindow.Done;
  239.   EraseMessage;
  240. end;
  241.  
  242. {****************************************************************************}
  243. { TResultsWindow.Close                                                       }
  244. {****************************************************************************}
  245. function TResultsWindow.Valid(Command : Word) : Boolean;
  246. begin
  247.   Valid := not TestRunning;
  248. end;
  249.  
  250. {****************************************************************************}
  251. { TResultsWindow.SizeLimits                                                  }
  252. {****************************************************************************}
  253. procedure TResultsWindow.SizeLimits(var Min, Max : TPoint);
  254. begin
  255.   TWindow.SizeLimits(Min, Max);
  256.   Min.X := 22;
  257. end;
  258.  
  259. end.